package com.newway.common.utils;

import org.springframework.http.HttpEntity;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpMethod;
import org.springframework.http.ResponseEntity;
import org.springframework.web.client.RestTemplate;

import java.util.Map;

public class HttpUtil {

    private static final RestTemplate restTemplate = new RestTemplate();

    /**
     * 发送GET请求
     * @param url 请求的URL
     * @param responseType 响应数据的类型
     * @param <T> 响应数据的泛型
     * @return 响应数据
     */
    public static <T> T getForObject(String url, Class<T> responseType) {
        return restTemplate.getForObject(url, responseType);
    }

    /**
     * 发送GET请求
     * @param url 请求的URL
     * @param responseType 响应数据的类型
     * @param uriVariables URL中的变量
     * @param <T> 响应数据的泛型
     * @return 响应数据
     */
    public static <T> T getForObject(String url, Class<T> responseType, Object... uriVariables) {
        return restTemplate.getForObject(url, responseType, uriVariables);
    }

    /**
     * 发送POST请求
     * @param url 请求的URL
     * @param request 请求体
     * @param responseType 响应数据的类型
     * @param <T> 响应数据的泛型
     * @return 响应数据
     */
    public static <T> T postForObject(String url, Object request, Class<T> responseType) {
        return restTemplate.postForObject(url, request, responseType);
    }

    /**
     * 发送POST请求
     * @param url 请求的URL
     * @param request 请求体
     * @param responseType 响应数据的类型
     * @param uriVariables URL中的变量
     * @param <T> 响应数据的泛型
     * @return 响应数据
     */
    public static <T> T postForObject(String url, Object request, Class<T> responseType, Object... uriVariables) {
        return restTemplate.postForObject(url, request, responseType, uriVariables);
    }

    /**
     * 发送GET请求并返回ResponseEntity
     * @param url 请求的URL
     * @param responseType 响应数据的类型
     * @param <T> 响应数据的泛型
     * @return ResponseEntity
     */
    public static <T> ResponseEntity<T> getForEntity(String url, Class<T> responseType) {
        return restTemplate.getForEntity(url, responseType);
    }

    /**
     * 发送GET请求并返回ResponseEntity
     * @param url 请求的URL
     * @param responseType 响应数据的类型
     * @param uriVariables URL中的变量
     * @param <T> 响应数据的泛型
     * @return ResponseEntity
     */
    public static <T> ResponseEntity<T> getForEntity(String url, Class<T> responseType, Object... uriVariables) {
        return restTemplate.getForEntity(url, responseType, uriVariables);
    }

    /**
     * 发送POST请求并返回ResponseEntity
     * @param url 请求的URL
     * @param request 请求体
     * @param responseType 响应数据的类型
     * @param <T> 响应数据的泛型
     * @return ResponseEntity
     */
    public static <T> ResponseEntity<T> postForEntity(String url, Object request, Class<T> responseType) {
        return restTemplate.postForEntity(url, request, responseType);
    }

    /**
     * 发送POST请求并返回ResponseEntity
     * @param url 请求的URL
     * @param request 请求体
     * @param responseType 响应数据的类型
     * @param uriVariables URL中的变量
     * @param <T> 响应数据的泛型
     * @return ResponseEntity
     */
    public static <T> ResponseEntity<T> postForEntity(String url, Object request, Class<T> responseType, Object... uriVariables) {
        return restTemplate.postForEntity(url, request, responseType, uriVariables);
    }

    /**
     * 发送自定义HTTP请求
     * @param url 请求的URL
     * @param method 请求方法
     * @param request 请求体
     * @param responseType 响应数据的类型
     * @param headers 请求头
     * @param <T> 响应数据的泛型
     * @return 响应数据
     */
    public static <T> T exchange(String url, HttpMethod method, Object request, Class<T> responseType, Map<String,String> headers) {
        HttpHeaders httpHeaders = new HttpHeaders();
        if (headers != null) {
            headers.forEach(httpHeaders::add);
        }
        HttpEntity<Object> httpEntity = new HttpEntity<>(request, httpHeaders);
        ResponseEntity<T> responseEntity = restTemplate.exchange(url, method, httpEntity, responseType);
        return responseEntity.getBody();
    }
}